#define _USE_MATH_DEFINES

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <cassert>
#include <stack>
#include <cstdlib>
#include <bitset>
#include <cmath>

#define forn(i,n) for (int i = 0; i < int(n); ++i)
#define pb push_back
#define all(a) a.begin(),a.end()
#define sz(a) int(a.size())
#define mp make_pair

using namespace std;

typedef long long li;
typedef long double ld;

typedef pair<int,int> pt;
#define ft first
#define sc second

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld EPS = 1e-9;

//#define TASK_NAME ""

const int N = 40 * 1000 + 5;
const int M = 200 * 1000 + 5;

int n, m;
int W[M];
vector <pt> g[N], e[N];

bool read() {
	if (scanf("%d %d", &n, &m) != 2)
		return false;
	forn(i, m) {
		int a, b;
		scanf("%d %d %d", &a, &b, &W[i]);
		--a, --b;
		g[a].pb(mp(b, i));
		g[b].pb(mp(a, i));
	}
	return true;
}

li d[2][N];

void dejkstra(li* d, int st) {
	priority_queue < pair<li, int> > q;
	forn(i, n)
		d[i] = INF64;
	d[st] = 0;
	q.push(mp(-d[st], st));

	while (!q.empty()) {
		pair<li, int> p = q.top(); q.pop();
		int v = p.sc;
		if (-p.ft != d[v])
			continue;

		forn(i, sz(g[v])) {
			int to = g[v][i].ft;
			int w = W[g[v][i].sc];

			if (d[v] + w < d[to]) {
				d[to] = d[v] + w;
				q.push(mp(-d[to], to));
			}
		}
	}
}

int tin[N], T, fup[N];
bool need[M];

int dfs(int v, int pid) {
	tin[v] = T++;
	fup[v] = tin[v];

	forn(i, sz(e[v])) {
		int to = e[v][i].ft;
		int id = e[v][i].sc;

		if (id == pid)
			continue;

		if (tin[to] != -1) {
			fup[v] = min(fup[v], tin[to]);
			continue;
		}

		int f = dfs(to, id);
		if (f > tin[v])
			need[id] = true;

		fup[v] = min(fup[v], f);
	}

	return fup[v]; 
}

bool tr[M];

void solve() {
	dejkstra(d[0], 0);
	dejkstra(d[1], n - 1);

	li best = d[0][n - 1];

	forn(i, n) {
		forn(j, sz(g[i])) {
			int to = g[i][j].ft;
			int w = W[g[i][j].sc];

			if (d[0][i] + w + d[1][to] == best) {
				tr[g[i][j].sc] = true;
			}
		}
	}

	forn(i, n)
		forn(j, sz(g[i]))
			if (tr[g[i][j].sc])
				e[i].pb(g[i][j]);

	memset(tin, -1, sizeof(tin));
	dfs(0, -1);

	vector <int> ans;
	forn(i, m)
		if (need[i])
			ans.pb(i);

	printf("%d\n", sz(ans));
	forn(i, sz(ans))
		printf("%d ", ans[i] + 1);
	puts("");
}

int main() {
#ifdef TASK_NAME
	freopen(TASK_NAME ".in", "r", stdin);
	freopen(TASK_NAME ".out", "w", stdout);
#endif

#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif

	while (read())
		solve();

	return 0;
}